package main

import "fmt"

//byte和rune类型
//Go语言中为了处理非ASCII类型的字符，定义了新的rune类型

/* 当需要处理中文、日文或者其他复合字符时，
则需要用到rune类型。rune类型实际是一个int32,字符 */
/*
int8类型，或者叫 byte 型，代表了ASCII码的一个字符。
rune类型，代表一个 UTF-8字符。
UTF8编码下一个中文汉字由3~4个字节组成，
所以我们不能简单的按照字节去遍历一个包含中文的字符串，
一个汉字占用3~4个字节，1字节=8bit（8个二进制位）
单独的字母 汉字 符号表示一个字符
1个字符 'A'=1个字节
1个utf8编码的汉字 "沙"=一般占用3个字节
*/

func main() {
	s := "Hello沙河"
	//len()求的是byte字节的长度
	n := len(s) //求字符串的s的长度，把长度保存到变量n中
	fmt.Println(n)

	// for i := 0; i < len(s); i++ {
	// 	fmt.Print(s[i])
	// 	fmt.Printf("\t%c \n", s[i]) //%c代表字符

	// }

	//Go 使用了特殊的 rune 类型来处理 Unicode，
	// 让基于 Unicode 的文本处理更为方便，
	// 也可以使用 byte 型进行默认字符串处理，性能和扩展性都有照顾。
	for _, c := range s {
		fmt.Printf("%v\t%c \n", c, c) //%c代表字符
	}

	//字符串修改
	s2 := "a白萝卜b"
	//把字符串强制转换成一个rune切片,rune切片保留的是一个一个字符
	s3 := []rune(s2)
	fmt.Println(s3)
	fmt.Printf("%c \n", s3)
	fmt.Printf("%c \n", s3[1])
	s3[1] = '红'
	fmt.Println("转字符串后：")
	fmt.Println(string(s3)) //把rune切片强制转换成字符串

	c1 := "红" //字符串
	c2 := '红' //字符  rune(int32)
	fmt.Printf("%T\t%T \n", c1, c2)

	c3 := "H"
	c4 := 'H'
	fmt.Printf("%T\t%T \n", c3, c4)
	fmt.Printf("%d \n", c4) //转十进制

	c5 := byte('H') //byte(uint8)
	fmt.Printf("%T\t%d\n", c5, c5)

	//类型转换
	n1 := 10 //int
	var f float64 = float64(n1)
	//f = float64(n1)
	fmt.Printf("%T\t%v \n", n1, n1)
	fmt.Printf("%T\t%v \n", f, f)

}
